gdk: Always deliver key events to toplevels
authorMatthias Clasen <mclasen@redhat.com>
Sat, 8 Jun 2019 13:39:53 +0000 (13:39 +0000)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 9 Jun 2019 17:38:54 +0000 (17:38 +0000)
This is just a hack to see that this works.
Eventually, the backends should do the right
thing.

gdk/gdksurface.c

index 3beff1e9cf9ce881cf8217c954ab0d04d9488aea..333c5d39a646772502b441f02a4fb00d35e29270 100644 (file)
@@ -4030,6 +4030,32 @@ check_autohide (GdkEvent *event)
   return FALSE;
 }
 
+static gboolean
+is_key_event (GdkEvent *event)
+{
+  switch ((guint) gdk_event_get_event_type (event))
+    {
+    case GDK_KEY_PRESS:
+    case GDK_KEY_RELEASE:
+      return TRUE;
+    default:;
+    }
+
+  return FALSE;
+}
+
+static void
+rewrite_event_for_toplevel (GdkEvent *event)
+{
+  GdkSurface *surface;
+
+  surface = gdk_event_get_surface (event);
+  while (surface->parent)
+    surface = surface->parent;
+
+  g_set_object (&event->any.surface, surface);
+}
+
 gboolean
 gdk_surface_handle_event (GdkEvent *event)
 {
@@ -4046,6 +4072,8 @@ gdk_surface_handle_event (GdkEvent *event)
     }
   else
     {
+      if (is_key_event (event))
+        rewrite_event_for_toplevel (event);
       g_signal_emit (gdk_event_get_surface (event), signals[EVENT], 0, event, &handled);
     }